<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>16.1.1-文本模式及其对解析器的影响</title>
</head>
<body>
    
</body>
    <script>
        /**
         * 文本模式指的是解析器在工作时所进入的一些特殊状态，
         *  在不同的特殊状态下，解析器对文本的解析行为会有所不同
         * - <title> 标签、<textarea> 标签，当解析器遇到这两个标签时，会切换到 RCDATA 模式；
         * - <style>、<xmp>、<iframe>、<noembed>、<noframes>、<noscript> 等标签，当解析器遇到这些标签时，会切换到RAWTEXT 模式；
         * - 当解析器遇到 <![CDATA[ 字符串时，会进入 CDATA 模式。
         * 
         * 解析器的初始模式则是 DATA 模式
         * - Vue.js 的模板 DSL 来说，模板中不允许出现 <script> 标签，
         *    因此 Vue.js 模板解析器在遇到 <script> 标签时也会切换到RAWTEXT 模式
         * - DATA 模式下，解析器在遇到字符 <时，会切换到标签开始状态（tag open state）​。
         *    换句话说，在该模式下，解析器能够解析标签元素
         * - 当解析器遇到字符 & 时，会切换到字符引用状态（character reference state）​，也称 HTML 字符实体状态。
         *    也就是说，在 DATA 模式下，解析器能够处理 HTML 字符实体
         * 
         * 当解析器处于 RCDATA 状态
         * - 解析器遇到字符 < 时，不会再切换到标签开始状态，而会切换到 RCDATA less-than sign state 状态
         *   - 在 RCDATA less-than sign state 状态下，如果解析器遇到字符 /，
         *      则直接切换到 RCDATA 的结束标签状态，即 RCDATA end tag open state
         * - 可知，在 RCDATA 状态下，解析器不能识别标签元素
         * - 间接说明了在 <textarea> 内可以将字符< 作为普通文本，解析器并不会认为字符 < 是标签开始的标志
         * - 在RCDATA 模式下，解析器仍然支持 HTML 实体。
         *    因为当解析器遇到字符 & 时，会切换到字符引用状态
         * 
         * RAWTEXT 模式下的工作方式与在 RCDATA 模式下类似
         * - 唯一不同的是，在 RAWTEXT 模式下，解析器将不再支持 HTML 实体
         * - 该模式下，解析器会将 HTML 实体字符作为普通字符处理
         * - Vue.js 的单文件组件的解析器在遇到 <script> 标签时就会进入 RAWTEXT 模式，
         *    这时它会把 <script> 标签内的内容全部作为普通文本处理
         * 
         * CDATA 模式在 RAWTEXT 模式的基础上更进一步
         * - 将把任何字符都作为普通字符处理，直到遇到 CDATA 的结束标志为止
         * 
         * PLAINTEXT 模式
         * - 与 RAWTEXT 模式类似
         * - 不同的是，解析器一旦进入 PLAINTEXT 模式，将不会再退出
         * - Vue.js 的模板 DSL 解析器是用不到 PLAINTEXT 模式
         * 
         * */ 

        const TextModes = {
            DATA: 'DATA', // 普通文本模式
            RCDATA: 'RCDATA', // 受限的 CDATA 模式
            RAWTEXT: 'RAWTEXT', // 原始文本模式
            CDATA: 'CDATA' // CDATA 模式
        }
    </script>
    

</html>